home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / 081-090 / amok82 / plot / source / plotinit.mod < prev    next >
Text File  |  1993-11-04  |  44KB  |  1,432 lines

  1. (***********************************************************************
  2.  
  3.    :Program.    Plotinit.mod
  4.    :Author.     Stefan Köhle
  5.    :Address.    Erhardtstr. 10
  6.                 W-7033 Herrenberg
  7.    :Phone.      07032/5146
  8.    :shortcut.
  9.    :Version.    1.0
  10.    :Date.       31.12.92
  11.    :Copyright.  nix
  12.    :Language.   Modula-II.
  13.    :Translator. M2Amiga 4.107d
  14.    :Imports.    Formelauswertung,
  15.                 FormelausFText   by Stefan Salewski    (AMOK 11)
  16.                 Req.Library      by Jürgen Zimmermann  (AMOK 55)
  17.                 ReqSupport       by Jürgen Zimmermann  (AMOK 55)
  18.                 ReqTools.Library by Nico Francois      (AMOK 69)
  19.                 ReqTools.def     by Kai Bolay          (AMOK 69)
  20.                 ReqToolsSupport  by Frank Lömker       (AMOK 69)
  21.                 IFFLib           by Christian A. Weber (AMOK 18)
  22.                 IFFLib.def       by Fridtjof Siebert   (AMOK 18)
  23.                 MyMathLib        by myself
  24.    :UpDate.     -
  25.    :Contents.
  26.    :Remark.
  27.  
  28. **********************************************************************)
  29.  
  30. IMPLEMENTATION MODULE PlotInit;
  31.  
  32.  
  33. FROM   Formelauswertung IMPORT AssignFFP,DefFormel ;
  34. FROM   FormelausFText   IMPORT GetFehlertext ;
  35. FROM   ReqSupport       IMPORT FileRequest ;
  36. IMPORT rt: ReqTools ;
  37. FROM   ReqToolsSupport  IMPORT vEZRequest,EZRequest ;
  38. IMPORT IFFLib ;
  39.  
  40. FROM MyMathLib   IMPORT FFPToInt ;
  41.  
  42. FROM SYSTEM IMPORT BYTE,ADR,ADDRESS,FFP,LONGSET,BITSET,TAG ;
  43. IMPORT GraphicsL,  GraphicsD ;
  44. IMPORT IntuitionL, IntuitionD ;
  45. IMPORT ExecL,      ExecD ;
  46. IMPORT String ;
  47. IMPORT DosL ;
  48.  
  49. FROM IntuitionD  IMPORT WindowPtr,checked ;
  50. FROM InOut       IMPORT WriteCard,WriteInt,SetOutput,WriteBytes,SetInput,
  51.                         WriteString,ReadString,ReadBytes,CloseOutput,CloseInput;
  52. FROM DosL        IMPORT Lock,UnLock,CurrentDir ;
  53. FROM DosD        IMPORT FileLockPtr,FileLock,sharedLock ;
  54. FROM UtilityD    IMPORT tagEnd ;
  55. FROM GraphicsD   IMPORT BitMapPtr,ViewModeSet,ViewModes ;
  56.  
  57.  
  58. CONST
  59.      Depth = 1 ;
  60.      Colors = 2 ;
  61.      RasWidth = 320 ;
  62.      RasHeight = 200 ;
  63.      BitMapWidth = 1720 ;
  64.      BitMapHeight = 1351 ;
  65.  
  66. TYPE
  67.      Array      = ARRAY[0..3] OF BYTE ;
  68.      FFPPtr     = POINTER TO FFP ;
  69.      IntegerPtr = POINTER TO INTEGER ;
  70.  
  71.      FeldText= ARRAY [0..59] OF CHAR;
  72.      Datum= RECORD
  73.              text:FeldText;
  74.              sichtbareZeichen:[1..250];
  75.              buffer:Buffer;
  76.             END;
  77.  
  78.      Variablen = RECORD
  79.                     tr           : GraphicsD.TmpRas ;
  80.                     ai           : GraphicsD.AreaInfo ;
  81.                     AreaBuffer   : ARRAY [0..16] OF CARDINAL ;
  82.                     ScreenHeight,
  83.                     ScreenWidth  : INTEGER ;
  84.                     gfxBase      : GraphicsD.GfxBasePtr ;
  85.                     topaz80attr  : GraphicsD.TextAttr;
  86.                     Bytewert     : CARDINAL ;
  87.                     Bitwert      : SHORTCARD;
  88.                     BytePtr      : POINTER TO BITSET ;
  89.                     Index        : CARDINAL ;
  90.                     windowTitel  : Buffer ;
  91.                     eingaben     : ARRAY [0..3] OF Datum ;
  92.                     Funktion     : Buffer ;
  93.                     FlPtr,OldLock: FileLockPtr ;
  94.                  END (* RECORD *) ;
  95.  
  96.  
  97. VAR
  98.      V          :  POINTER TO Variablen ;
  99.      Pb         :  PlotBasePtr ;
  100.      error      :  (noerror,cancel,Fehler) ;
  101.      i          :  CARDINAL ;
  102.      j          :  INTEGER ;
  103.      l          :  FFP ;
  104.      trp        :  ADDRESS ;
  105.      PlaneSpeicher: ADDRESS ;
  106.      OK         : BOOLEAN ;
  107.      MyBitMapPtr:  GraphicsD.BitMapPtr ;
  108.  
  109.  
  110.  
  111. PROCEDURE Request(Text: ARRAY OF CHAR; GadgetText: ARRAY OF CHAR;
  112.                   Win: WindowPtr) ;
  113.  
  114.  VAR
  115.     tagbuf    : ARRAY [0..3] OF LONGINT;
  116.     adr       : ADDRESS ;
  117.  
  118.  BEGIN
  119.     IF Win # NIL THEN
  120.        adr := TAG(tagbuf,rt.Window,Win,tagEnd ) ;
  121.        vEZRequest(ADR(Text),ADR(GadgetText),NIL,NIL,adr) ;
  122.     ELSE
  123.        vEZRequest(ADR(Text),ADR(GadgetText),NIL,NIL,NIL) ;
  124.     END ;
  125.  END Request ;
  126.  
  127.  
  128.  
  129. PROCEDURE YesNoRequest(Text: ARRAY OF CHAR; GadgetText: ARRAY OF CHAR;
  130.                        Win: WindowPtr): BOOLEAN ;
  131.  
  132.  VAR
  133.     tagbuf    : ARRAY [0..3] OF LONGINT;
  134.     adr       : ADDRESS ;
  135.  
  136.  BEGIN
  137.     IF Win # NIL THEN
  138.        adr := TAG(tagbuf,rt.Window,Win,tagEnd ) ;
  139.     ELSE
  140.        adr := NIL ;
  141.     END ;
  142.  
  143.     IF EZRequest(ADR(Text),ADR(GadgetText),NIL,NIL,adr) = 0 THEN
  144.        RETURN TRUE ;
  145.     ELSE
  146.        RETURN FALSE ;
  147.     END ;
  148.  
  149.  
  150.  END YesNoRequest ;
  151.  
  152.  
  153.  
  154. PROCEDURE StringRequest(VAR Pb: PlotBasePtr): BOOLEAN ;
  155.  
  156.  VAR reqInfo: rt.ReqInfoPtr ;
  157.      tagbuf : ARRAY[0..3] OF LONGINT ;
  158.      adr    : ADDRESS ;
  159.  
  160.  BEGIN
  161.  
  162.   reqInfo := rt.AllocRequestA (rt.TypeReqInfo, NIL);
  163.   reqInfo^.width := 600 ;
  164.  
  165.   adr := TAG(tagbuf,rt.Window,Pb^.Window,tagEnd) ;
  166.  
  167.   IF NOT rt.GetString(ADR(Pb^.Funktion),250,ADR(V^.windowTitel),reqInfo,adr) THEN
  168.      rt.FreeRequest(reqInfo) ;
  169.      RETURN FALSE ;
  170.   ELSE
  171.      rt.FreeRequest(reqInfo) ;
  172.      RETURN TRUE ;
  173.   END ;
  174.  
  175.  END StringRequest ;
  176.  
  177.  
  178.  
  179. (*---------------------------------------------------------------------------
  180.  
  181.      Hier werden alle Speicher alloziert, die Bitmap initialisiert
  182.      und der Screen und das Fenster aufgemacht
  183.  
  184.   --------------------------------------------------------------------------*)
  185.  
  186. PROCEDURE SetUp(VAR Pb: PlotBasePtr): CARDINAL ;
  187.  
  188.  VAR
  189.      MyWindow   : IntuitionD.NewWindow ;
  190.      MyScreen   : IntuitionD.NewScreen ;
  191.  
  192.  
  193.  BEGIN
  194.                                      (**** Speicher allozieren ****)
  195.  
  196.    V := ExecL.AllocMem(SIZE(Variablen),
  197.                        ExecD.MemReqSet{ExecD.public,ExecD.memClear}) ;
  198.    IF V = NIL THEN
  199.       CleanUp(Pb) ;
  200.       RETURN 7 ;
  201.    END ;
  202.  
  203.  
  204.    IF Pb^.GrosserSpeicher THEN       (**** fuer Plane ****)
  205.       PlaneSpeicher := GraphicsL.AllocRaster(BitMapWidth,BitMapHeight) ;
  206.       IF PlaneSpeicher = NIL THEN
  207.          CleanUp(Pb) ;
  208.          RETURN 3 ;
  209.       END (* IF *) ;
  210.                                      (**** fuer BitMapPointer ****)
  211.       MyBitMapPtr   := ExecL.AllocMem(SIZE(GraphicsD.BitMap),
  212.                                       ExecD.MemReqSet{ExecD.public}) ;
  213.  
  214.       IF MyBitMapPtr = NIL  THEN
  215.          CleanUp(Pb) ;
  216.          RETURN 2 ;
  217.       END ;
  218.  
  219.    END ;
  220.  
  221.  
  222.    trp := GraphicsL.AllocRaster(RasWidth,RasHeight) ;(**** fuer TempRas ****)
  223.    IF trp = NIL THEN
  224.       CleanUp(Pb) ;
  225.       RETURN 4 ;
  226.    END (* IF *) ;
  227.  
  228.  
  229.    WITH V^.topaz80attr DO
  230.      name  := ADR("topaz.font");
  231.      ySize := 8;
  232.      style := GraphicsD.normalFont;
  233.      flags := GraphicsD.FontFlagSet{GraphicsD.romFont}
  234.    END;
  235.  
  236.  
  237.    V^.gfxBase := ADR(GraphicsL) ;
  238.  
  239.    IF V^.gfxBase = NIL THEN
  240.       Pb^.ScreenHeight := 512 ; Pb^.ScreenWidth := 640 ;
  241.    ELSE
  242.       Pb^.ScreenHeight := 2*V^.gfxBase^.normalDisplayRows ;
  243.       Pb^.ScreenWidth := V^.gfxBase^.normalDisplayColumns ;
  244.    END (* IF *) ;
  245.  
  246.  
  247.    WITH MyWindow DO
  248.  
  249.       leftEdge    := 0   ;   detailPen := 0   ;   width  := Pb^.ScreenWidth  ;
  250.       topEdge     := 0   ;   blockPen  := 1   ;   height := Pb^.ScreenHeight ;
  251.       firstGadget := NIL ;   checkMark := NIL ;   title  := NIL ;
  252.       minWidth    := 0   ;   maxWidth  := 0   ;   screen := NIL ;
  253.       minHeight   := 0   ;   maxHeight := 0   ;   bitMap := NIL ;
  254.  
  255.       idcmpFlags  := IntuitionD.IDCMPFlagSet {IntuitionD.menuPick,
  256.                                               IntuitionD.rawKey   } ;
  257.       type        := IntuitionD.ScreenFlagSet{IntuitionD.publicScreen} ;
  258.  
  259.       IF Pb^.GrosserSpeicher THEN
  260.          flags    := IntuitionD.WindowFlagSet{IntuitionD.superBitMap  ,
  261.                                               IntuitionD.backDrop     ,
  262.                                               IntuitionD.gimmeZeroZero,
  263.                                               IntuitionD.activate     };
  264.       ELSE
  265.          flags    := IntuitionD.WindowFlagSet{IntuitionD.backDrop     ,
  266.                                               IntuitionD.gimmeZeroZero,
  267.                                               IntuitionD.activate     };
  268.       END (* IF *) ;
  269.  
  270.    END (* WITH *) ;
  271.  
  272.  
  273.    WITH MyScreen DO
  274.       leftEdge := 0 ;  detailPen := 0   ;  width  := Pb^.ScreenWidth  ;
  275.       topEdge  := 0 ;  blockPen  := 1   ;  height := Pb^.ScreenHeight ;
  276.       depth    := 1 ;  gadgets   := NIL ;  defaultTitle := NIL ;
  277.  
  278.       font     := ADR(V^.topaz80attr)   ;  customBitMap := NIL ;
  279.       type     := IntuitionD.ScreenFlagSet{IntuitionD.publicScreen,
  280.                                          IntuitionD.screenBehind} ;
  281.       viewModes:= ViewModeSet{hires,lace};
  282.    END (* WITH *) ;
  283.  
  284.  
  285.    IF Pb^.GrosserSpeicher THEN
  286.       GraphicsL.InitBitMap(MyBitMapPtr^,1,BitMapWidth,BitMapHeight) ;
  287.       MyBitMapPtr^.planes[0] := PlaneSpeicher ;
  288.       MyWindow.bitMap := MyBitMapPtr ;
  289.    END (* IF *) ;
  290.  
  291.  
  292.    GraphicsL.InitTmpRas(V^.tr,trp,((RasWidth+15) DIV 16)*RasHeight);
  293.    GraphicsL.InitArea(V^.ai,ADR(V^.AreaBuffer),SIZE(V^.AreaBuffer) DIV 5) ;
  294.  
  295.  
  296.                  (********** Screen aufmachen **********)
  297.  
  298.    Pb^.Screen:=IntuitionL.OpenScreen(MyScreen) ;
  299.    IF Pb^.Screen = NIL THEN
  300.       CleanUp(Pb) ;
  301.       RETURN 5 ;
  302.    END (* IF *) ;
  303.  
  304.  
  305.  
  306.                    (********** Window aufmachen **********)
  307.  
  308.    MyWindow.screen := Pb^.Screen ;
  309.  
  310.    Pb^.Window:=IntuitionL.OpenWindow(MyWindow) ;
  311.    IF Pb^.Window = NIL THEN
  312.       CleanUp(Pb) ;
  313.       RETURN 6 ;
  314.    END (* IF *) ;
  315.  
  316.  
  317.    Pb^.Rp := Pb^.Window^.rPort ;
  318.    Pb^.Layer := Pb^.Rp^.layer ;
  319.    Pb^.Rp^.areaInfo := ADR(V^.ai) ;
  320.    Pb^.Rp^.tmpRas := ADR(V^.tr) ;
  321.  
  322.    GraphicsL.SetRGB4(ADR(Pb^.Screen^.viewPort),0,10,10,10) ;
  323.    GraphicsL.SetRGB4(ADR(Pb^.Screen^.viewPort),1,0,0,0) ;
  324.  
  325.  
  326.    RETURN 0 ;
  327.  
  328. END SetUp;
  329.  
  330.  
  331.  
  332. PROCEDURE CleanUp(VAR Pb: PlotBasePtr); (*************************************)
  333.  
  334.  BEGIN
  335.  
  336.    IF Pb # NIL THEN
  337.       IF Pb^.Screen # NIL THEN
  338.          IF Pb^.Window # NIL THEN
  339.             IF Pb^.Window^.menuStrip # NIL THEN
  340.                IntuitionL.ClearMenuStrip(Pb^.Window) ;
  341.                Pb^.Window^.menuStrip := NIL ;
  342.             END (* IF *) ;
  343.             IntuitionL.CloseWindow(Pb^.Window) ;
  344.             Pb^.Window := NIL ;
  345.          END (* IF *) ;
  346.          IntuitionL.CloseScreen(Pb^.Screen) ;
  347.          Pb^.Screen := NIL ;
  348.       END (* IF *) ;
  349.    END (* IF Pb=NIL *) ;
  350.  
  351.  
  352.    IF MyBitMapPtr # NIL THEN
  353.       IF MyBitMapPtr^.planes[0] # NIL THEN
  354.          GraphicsL.FreeRaster(MyBitMapPtr^.planes[0],BitMapWidth,BitMapHeight) ;
  355.          MyBitMapPtr^.planes[0] := NIL ;
  356.       END ;
  357.  
  358.       ExecL.FreeMem(MyBitMapPtr,SIZE(GraphicsD.BitMap)) ;
  359.       MyBitMapPtr := NIL ;
  360.    END (* IF *) ;
  361.  
  362.  
  363.    IF trp # NIL THEN
  364.       GraphicsL.FreeRaster(trp,RasWidth,RasHeight) ;
  365.       trp := NIL ;
  366.    END (* IF *) ;
  367.  
  368.    IF V  # NIL THEN
  369.       ExecL.FreeMem(V,SIZE(Variablen)) ;
  370.       V := NIL ;
  371.    END ;
  372.  
  373.  
  374. END CleanUp ;
  375.  
  376.  
  377.  
  378. (*-----------------------------------------------------------------
  379.  
  380.     Hier wird nach Aufruf des Filerequesters die Funktion, alle
  381.     Zoom- und sonstigen Faktoren und Einstellungen gespeichert.
  382.  
  383.   -----------------------------------------------------------------*)
  384.  
  385. PROCEDURE Speichern(VAR Pb: PlotBasePtr): BOOLEAN ;  (***********************)
  386.  
  387.  VAR SpeicherString : ARRAY[0..10] OF CHAR ;
  388.      BytesPtr       : POINTER TO Array ;
  389.      Bytes          : Array ;
  390.  
  391.  BEGIN
  392.  
  393.   Pb^.letzterName := Pb^.FunktionName ;
  394.  
  395.   IF FileRequest(Pb^.Window,FALSE,FALSE,'Funktion speichern',
  396.                                       Pb^.DirFunktionen,Pb^.FunktionName)  THEN
  397.  
  398.      V^.FlPtr:=Lock(ADR(Pb^.DirFunktionen),sharedLock);
  399.  
  400.      IF V^.FlPtr = NIL THEN
  401.         vEZRequest(ADR("Sorry, kriege keinen Lock auf dieses Verzeichnis"),
  402.                    ADR("Na dann nicht"),NIL,NIL,NIL) ;
  403.         UnLock(V^.FlPtr);
  404.      ELSE
  405.         V^.OldLock := CurrentDir(V^.FlPtr) ;
  406.      END ;
  407.  
  408.      SetOutput(Pb^.FunktionName) ;
  409.  
  410.      SpeicherString := 'PlF ' ;
  411.      WriteString(SpeicherString) ;
  412.  
  413.      IF Pb^.Raster THEN
  414.         SpeicherString[0] := 'R' ;
  415.      ELSE
  416.         SpeicherString[0] := '0' ;
  417.      END ;
  418.  
  419.      IF Pb^.Achsen THEN
  420.         SpeicherString[1] := 'A' ;
  421.      ELSE
  422.         SpeicherString[1] := '0' ;
  423.      END ;
  424.  
  425.      IF Pb^.Kasten THEN
  426.         SpeicherString[2] := 'K' ;
  427.      ELSE
  428.         SpeicherString[2] := '0' ;
  429.      END ;
  430.  
  431.      IF Pb^.Beschriftung THEN
  432.         SpeicherString[3] := 'B' ;
  433.      ELSE
  434.         SpeicherString[3] := '0' ;
  435.      END ;
  436.  
  437.      IF Pb^.Flaeche THEN
  438.         SpeicherString[4] := 'F' ;
  439.      ELSE
  440.         SpeicherString[4] := '0' ;
  441.      END ;
  442.  
  443.      IF Pb^.FSchreiben THEN
  444.         SpeicherString[5] := 'S' ;
  445.      ELSE
  446.         SpeicherString[5] := '0' ;
  447.      END ;
  448.  
  449.      SpeicherString[6] := ' ' ;
  450.  
  451.      WriteString(SpeicherString) ;
  452.  
  453.      BytesPtr := ADR(Pb^.B.XLinks) ;
  454.      Bytes   := BytesPtr^ ;
  455.      WriteBytes(Bytes) ;
  456.  
  457.      BytesPtr := ADR(Pb^.B.DeltaX) ;
  458.      Bytes   := BytesPtr^ ;
  459.      WriteBytes(Bytes) ;
  460.  
  461.      BytesPtr := ADR(Pb^.B.YHinten) ;
  462.      Bytes   := BytesPtr^ ;
  463.      WriteBytes(Bytes) ;
  464.  
  465.      BytesPtr := ADR(Pb^.B.DeltaY) ;
  466.      Bytes   := BytesPtr^ ;
  467.      WriteBytes(Bytes) ;
  468.  
  469.      BytesPtr := ADR(Pb^.B.ZOben) ;
  470.      Bytes   := BytesPtr^ ;
  471.      WriteBytes(Bytes) ;
  472.  
  473.      BytesPtr := ADR(Pb^.B.DeltaZ) ;
  474.      Bytes   := BytesPtr^ ;
  475.      WriteBytes(Bytes) ;
  476.  
  477.      BytesPtr := ADR(Pb^.Schritt) ;
  478.      Bytes   := BytesPtr^ ;
  479.      WriteBytes(Bytes) ;
  480.  
  481.      WriteString(Pb^.Funktion) ;
  482.  
  483.      CloseOutput ;
  484.      RETURN TRUE ;
  485.   ELSE
  486.      Pb^.FunktionName := Pb^.letzterName ;
  487.      RETURN FALSE ;
  488.   END;
  489.  
  490. END Speichern ;
  491.  
  492.  
  493.  
  494. PROCEDURE Laden(VAR Pb: PlotBasePtr; Req: BOOLEAN): BOOLEAN  ;  (**************)
  495.  
  496.  VAR SpeicherString : ARRAY[0..15] OF CHAR ;
  497.      Bytes          : Array ;
  498.      ffpPtr         : FFPPtr ;
  499.      IntPtr         : IntegerPtr ;
  500.      ffp1,ffp2,ffp3,
  501.      ffp4,ffp5,ffp6 : FFP ;
  502.      Int1           : INTEGER ;
  503.      Fl2Ptr         : FileLockPtr ;
  504.  
  505.  
  506.  BEGIN
  507.  
  508.  
  509.   IF Req THEN                          (*********** Requester ***************)
  510.  
  511.      Pb^.letzterName := Pb^.FunktionName ;
  512.      IF NOT FileRequest(Pb^.Window,TRUE,FALSE,'Funktion laden',
  513.                                Pb^.DirFunktionen,Pb^.FunktionName)  THEN
  514.         RETURN FALSE ;           (********** Cancel im FileRequester **********)
  515.      END ;
  516.   END ;
  517.  
  518.   V^.FlPtr:=Lock(ADR(Pb^.DirFunktionen),sharedLock);
  519.   V^.OldLock := CurrentDir(V^.FlPtr) ;
  520.  
  521.   Fl2Ptr := Lock(ADR(Pb^.FunktionName),sharedLock) ;
  522.                                              (* Gucken obs das File gibt *)
  523.  
  524.   IF Fl2Ptr = NIL THEN
  525.      UnLock(Fl2Ptr) ;
  526.      IF Laden(Pb,TRUE) THEN
  527.         RETURN TRUE
  528.      ELSE
  529.         Pb^.FunktionName := Pb^.letzterName ;
  530.         RETURN FALSE
  531.      END (* IF *) ;
  532.   END ;
  533.   UnLock(Fl2Ptr) ;
  534.  
  535.   SetInput(Pb^.FunktionName) ;
  536.   ReadString(SpeicherString) ;
  537.  
  538.   IF String.ComparePart(SpeicherString,0,3,'PlF',TRUE) # 0 THEN
  539.      CloseInput ;
  540.      UnLock(V^.FlPtr) ;
  541.      Pb^.FunktionName := Pb^.letzterName ;
  542.      Request("Ist keine Plot-Funktion","Sowas",Pb^.Window) ;
  543.      RETURN FALSE ;
  544.   END ;
  545.  
  546.   ReadString(SpeicherString) ;
  547.   Pb^.LetzteFunktion := Pb^.Funktion ;
  548.  
  549.   ReadBytes(Bytes) ;  ffpPtr := ADR(Bytes) ;  ffp1 := ffpPtr^ ;
  550.   ReadBytes(Bytes) ;  ffpPtr := ADR(Bytes) ;  ffp2 := ffpPtr^ ;
  551.   ReadBytes(Bytes) ;  ffpPtr := ADR(Bytes) ;  ffp3 := ffpPtr^ ;
  552.   ReadBytes(Bytes) ;  ffpPtr := ADR(Bytes) ;  ffp4 := ffpPtr^ ;
  553.   ReadBytes(Bytes) ;  ffpPtr := ADR(Bytes) ;  ffp5 := ffpPtr^ ;
  554.   ReadBytes(Bytes) ;  ffpPtr := ADR(Bytes) ;  ffp6 := ffpPtr^ ;
  555.   ReadBytes(Bytes) ;  IntPtr := ADR(Bytes) ;  Int1 := IntPtr^ ;
  556.  
  557.   ReadString(Pb^.Funktion) ;
  558.   CloseInput ;
  559.  
  560.   IF NOT FunktionTesten(Pb) THEN
  561.      IF FunktionHolen(Pb,FALSE,FALSE) THEN
  562.         RETURN TRUE ;
  563.      ELSE
  564.         Pb^.Funktion := Pb^.LetzteFunktion ;
  565.         Pb^.FunktionName := Pb^.letzterName ;
  566.         RETURN FALSE ;
  567.      END ;
  568.   END  ;
  569.  
  570.   IF SpeicherString[0] = 'R' THEN
  571.      Pb^.Raster := TRUE ;
  572.   ELSE
  573.      Pb^.Raster := FALSE ;
  574.   END ;
  575.   IF SpeicherString[1] = 'A' THEN
  576.      Pb^.Achsen := TRUE ;
  577.   ELSE
  578.      Pb^.Achsen := FALSE ;
  579.   END ;
  580.   IF SpeicherString[2] = 'K' THEN
  581.      Pb^.Kasten := TRUE ;
  582.   ELSE
  583.      Pb^.Kasten := FALSE ;
  584.   END ;
  585.  
  586.   IF SpeicherString[3] = 'B' THEN
  587.      Pb^.Beschriftung := TRUE ;
  588.   ELSE
  589.      Pb^.Beschriftung := FALSE ;
  590.   END ;
  591.  
  592.   IF SpeicherString[4] = 'F' THEN
  593.      Pb^.Flaeche := TRUE ;
  594.   ELSE
  595.      Pb^.Flaeche := FALSE ;
  596.   END ;
  597.  
  598.   IF SpeicherString[5] = 'S' THEN
  599.      Pb^.FSchreiben := TRUE ;
  600.   ELSE
  601.      Pb^.FSchreiben := FALSE ;
  602.   END ;
  603.  
  604.   Pb^.B.XLinks := ffp1 ;
  605.   Pb^.B.DeltaX := ffp2 ;
  606.   Pb^.B.YHinten:= ffp3 ;
  607.   Pb^.B.DeltaY := ffp4 ;
  608.   Pb^.B.ZOben  := ffp5 ;
  609.   Pb^.B.DeltaZ := ffp6 ;
  610.   Pb^.Schritt  := Int1 ;
  611.   UnLock(V^.FlPtr) ;
  612.   RETURN TRUE ;              (********** Alles OK **********)
  613.  
  614.  
  615. END Laden ;
  616.  
  617.  
  618.  
  619. (*-------------------------------------------------------------
  620.  
  621.     Hier werden die Haken an den Menus gesetzt oder gelöscht
  622.  
  623.   -------------------------------------------------------------*)
  624.  
  625. PROCEDURE UpdateMenus(VAR Pb: PlotBasePtr; welches: CARDINAL) ;
  626.  
  627.  VAR ItemPtr: IntuitionD.MenuItemPtr ;
  628.  
  629.  BEGIN
  630.  
  631.    ItemPtr := IntuitionL.ItemAddress(Pb^.Window^.menuStrip,1) ;
  632.  
  633.    CASE welches OF 2:
  634.  
  635.       IF Pb^.GrosseBitmap THEN
  636.          EXCL (ItemPtr^.nextItem^.flags,IntuitionD.itemEnabled) ;(* gering   *)
  637.       ELSE
  638.          INCL (ItemPtr^.nextItem^.flags,IntuitionD.itemEnabled) ;(* gering   *)
  639.       END ;
  640.  
  641.       IF Pb^.Schritt = 6 THEN                   (* laecherlich *)
  642.          INCL (ItemPtr^.flags,checked) ;           (* laecherlich *)
  643.          EXCL (ItemPtr^.nextItem^.flags,checked) ; (* gering      *)
  644.          EXCL (ItemPtr^.nextItem^.nextItem^.flags, (* mittel      *)
  645.                                           checked) ;
  646.          EXCL (ItemPtr^.nextItem^.nextItem^.nextItem^.flags,
  647.                                           checked) ;    (* hoch        *)
  648.          EXCL (ItemPtr^.nextItem^.nextItem^.nextItem
  649.                      ^.nextItem^.flags,checked) ;  (* noch hoeher *)
  650.  
  651.       END ;
  652.  
  653.       IF Pb^.Schritt = 4 THEN                   (* gering *)
  654.          EXCL (ItemPtr^.flags,checked) ;                      (* laecherlich *)
  655.          INCL (ItemPtr^.nextItem^.flags,checked) ;            (* gering      *)
  656.          EXCL (ItemPtr^.nextItem^.nextItem^.flags,checked) ;  (* mittel      *)
  657.          EXCL (ItemPtr^.nextItem^.nextItem^.nextItem^.
  658.                                           flags,checked) ;    (* hoch        *)
  659.          EXCL (ItemPtr^.nextItem^.nextItem^.nextItem
  660.                               ^.nextItem^.flags,checked) ;    (* noch hoeher *)
  661.       END ;
  662.  
  663.       IF Pb^.Schritt = 3 THEN                   (* mittel *)
  664.          EXCL (ItemPtr^.flags,checked) ;                      (* laecherlich *)
  665.          EXCL (ItemPtr^.nextItem^.flags,checked) ;            (* gering      *)
  666.          INCL (ItemPtr^.nextItem^.nextItem^.flags,checked) ;  (* mittel      *)
  667.          EXCL (ItemPtr^.nextItem^.nextItem^.nextItem^.
  668.                                           flags,checked) ;    (* hoch        *)
  669.          EXCL (ItemPtr^.nextItem^.nextItem^.nextItem
  670.                               ^.nextItem^.flags,checked) ;    (* noch hoeher *)
  671.       END ;
  672.  
  673.       IF Pb^.Schritt = 2 THEN                   (* hoch *)
  674.          EXCL (ItemPtr^.flags,checked) ;                        (* laecherlich *)
  675.          EXCL (ItemPtr^.nextItem^.flags,checked) ;              (* gering      *)
  676.          EXCL (ItemPtr^.nextItem^.nextItem^.flags,checked) ;    (* mittel      *)
  677.          INCL (ItemPtr^.nextItem^.nextItem^.nextItem^.
  678.                                             flags,checked) ;    (* hoch        *)
  679.          EXCL (ItemPtr^.nextItem^.nextItem^.nextItem
  680.                                 ^.nextItem^.flags,checked) ;    (* noch hoeher *)
  681.       END ;
  682.  
  683.       IF Pb^.Schritt = 1 THEN                   (* noch hoeher *)
  684.          EXCL (ItemPtr^.flags,checked) ;                        (* laecherlich *)
  685.          EXCL (ItemPtr^.nextItem^.flags,checked) ;              (* gering      *)
  686.          EXCL (ItemPtr^.nextItem^.nextItem^.flags,checked) ;    (* mittel      *)
  687.          EXCL (ItemPtr^.nextItem^.nextItem^.nextItem^.
  688.                                             flags,checked) ;    (* hoch        *)
  689.          INCL (ItemPtr^.nextItem^.nextItem^.nextItem
  690.                                 ^.nextItem^.flags,checked) ;    (* noch hoeher *)
  691.       END |
  692.    3:
  693.       ItemPtr := IntuitionL.ItemAddress(Pb^.Window^.menuStrip,2) ;
  694.  
  695.       IF Pb^.Raster THEN
  696.          INCL (ItemPtr^.flags,checked) ;
  697.       ELSE
  698.          EXCL (ItemPtr^.flags,checked) ;
  699.       END ;
  700.  
  701.       IF Pb^.Kasten THEN
  702.          INCL(ItemPtr^.nextItem^.flags,checked) ;
  703.       ELSE
  704.          EXCL(ItemPtr^.nextItem^.flags,checked) ;
  705.       END ;
  706.  
  707.       IF Pb^.Achsen THEN
  708.          INCL(ItemPtr^.nextItem^.nextItem^.flags,checked) ;
  709.       ELSE
  710.          EXCL(ItemPtr^.nextItem^.nextItem^.flags,checked) ;
  711.       END ;
  712.  
  713.       IF Pb^.Beschriftung THEN
  714.          INCL(ItemPtr^.nextItem^.nextItem^.nextItem^.flags,checked) ;
  715.       ELSE
  716.          EXCL(ItemPtr^.nextItem^.nextItem^.nextItem^.flags,checked) ;
  717.       END ;
  718.  
  719.       IF Pb^.Flaeche THEN
  720.          INCL(ItemPtr^.nextItem^.nextItem^.nextItem^.nextItem^.flags,checked) ;
  721.       ELSE
  722.          EXCL(ItemPtr^.nextItem^.nextItem^.nextItem^.nextItem^.flags,checked) ;
  723.       END ;
  724.  
  725.       IF Pb^.FSchreiben THEN
  726.          INCL(ItemPtr^.nextItem^.nextItem^.nextItem^.nextItem^.
  727.                                                      nextItem^.flags,checked) ;
  728.       ELSE
  729.          EXCL(ItemPtr^.nextItem^.nextItem^.nextItem^.nextItem^.
  730.                                                      nextItem^.flags,checked) ;
  731.       END ;
  732.  
  733.       IF Pb^.GrosseBitmap THEN
  734.          EXCL(ItemPtr^.nextItem^.nextItem^.nextItem^.nextItem^.nextItem^.
  735.                                                      nextItem^.flags,checked) ;
  736.          INCL(ItemPtr^.nextItem^.nextItem^.nextItem^.nextItem^.nextItem^.
  737.                                            nextItem^.nextItem^.flags,checked) ;
  738.       ELSE
  739.          INCL(ItemPtr^.nextItem^.nextItem^.nextItem^.nextItem^.nextItem^.
  740.                                                      nextItem^.flags,checked) ;
  741.          EXCL(ItemPtr^.nextItem^.nextItem^.nextItem^.nextItem^.nextItem^.
  742.                                            nextItem^.nextItem^.flags,checked) ;
  743.       END ;
  744.  
  745.    ELSE
  746.    END ; (* CASE  *)
  747. END UpdateMenus ;
  748.  
  749.  
  750.  
  751. (*----------------------------------------------------------------------
  752.  
  753.    Hier wird der Stringrequester aufgerufen und der eingegebene String
  754.    auf Tauglichkeit untersucht. Wenn der String keine verwertbare Funktion
  755.    ist, dann kommt der Stringrequester nochmal mit der Fehlermeldung
  756.    als Fenstertitel.
  757.  
  758.    Es sei denn, Disk = TRUE, dann wurde
  759.    eine Funktion geladen und die wird dann nur getestet.
  760.  
  761.   ----------------------------------------------------------------------*)
  762.  
  763. PROCEDURE FunktionHolen(VAR Pb: PlotBasePtr ; Disk: BOOLEAN; NeueFunktion:
  764.                         BOOLEAN): BOOLEAN ;
  765.  
  766.  
  767.  BEGIN
  768.  
  769.    IF NeueFunktion THEN
  770.       Pb^.LetzteFunktion := Pb^.Funktion ;
  771.       Pb^.Funktion := "" ;
  772.    END ;
  773.  
  774.  
  775.    REPEAT
  776.  
  777.         IF Pb^.FehlerNummer = 0 THEN
  778.            V^.windowTitel:='Bitte Funktion eingeben: f(x,y) = ';
  779.         ELSE
  780.            GetFehlertext(Pb^.FehlerNummer,V^.windowTitel) ;
  781.         END ;
  782.  
  783.         IF Disk THEN   (* Falls laden per Requester testen obs ne Funktion ist*)
  784.            error := noerror ;
  785.         ELSE
  786.            IF StringRequest(Pb) THEN
  787.               error := noerror ;
  788.            ELSE                                         (* cancel gedrueckt *)
  789.               error := cancel ;
  790.            END (* IF *) ;
  791.         END  ;
  792.  
  793.         IF error = noerror THEN
  794.            IF NOT FunktionTesten(Pb) THEN
  795.               IF Pb^.FehlerNummer = 31 THEN (* Formel ist leer *)
  796.                  error := cancel ;
  797.               ELSE
  798.                  error := Fehler ;
  799.               END ;
  800.            END (* IF *) ;
  801.  
  802.         END (* IF *) ;
  803.         Disk := FALSE ;
  804.  
  805.    UNTIL error # Fehler ;
  806.  
  807.    IF error = cancel THEN
  808.       Pb^.FunktionName := Pb^.letzterName ;
  809.       RETURN FALSE ;
  810.    ELSE
  811.       RETURN TRUE ;
  812.    END (* IF *) ;
  813.  
  814. END FunktionHolen ;
  815.  
  816.  
  817. (*-------------------------------------------------------------------
  818.  
  819.    Die Procedur, die den String testet
  820.  
  821.   -------------------------------------------------------------------*)
  822.  
  823. PROCEDURE FunktionTesten(VAR Pb: PlotBasePtr): BOOLEAN ;
  824.  
  825.  VAR onlyLong : BOOLEAN ;
  826.  
  827.  BEGIN
  828.  
  829.     V^.eingaben[0].buffer :=Pb^.Funktion ;
  830.  
  831.     OK := AssignFFP("x",0.0) ;
  832.     OK := AssignFFP("y",0.0) ;
  833.     Pb^.FehlerNummer := DefFormel(2,V^.eingaben[0].buffer,TRUE,FALSE);
  834.  
  835.     IF Pb^.FehlerNummer#0 THEN
  836.        RETURN FALSE ;
  837.     ELSE
  838.        RETURN TRUE ;
  839.     END (* IF *) ;
  840.  
  841. END FunktionTesten ;
  842.  
  843.  
  844.  
  845. (*----------------------------------------------------------------------
  846.  
  847.    Hier werden die beim Aufruf aus dem CLI eventuell übergebenen Argumente
  848.    ausgewertet und geguckt obs ein Directory 'Bilder' und/oder 'Funktionen'
  849.    gibt, wohin dann beim Laden oder Speichern automatisch verzweigt wird.
  850.  
  851.    Das Argument (es wird nur das Erste genommen) wird zuerst als Name einer
  852.    gespeicherten Funktion interpretiert. Nur wenn es in Funktionen kein
  853.    solches File gibt, wird das Argument als Funktion interpretiert.
  854.    Falls die Funktion Fehler enthält, kommt der Stringrequester und weist
  855.    darauf hin.
  856.  
  857.   -----------------------------------------------------------------------*)
  858.  
  859.  
  860. PROCEDURE ArgTesten(VAR Pb: PlotBasePtr; Arg: BOOLEAN): BOOLEAN ;
  861.  
  862.  VAR   Lenge : INTEGER ;
  863.  
  864.  
  865.  BEGIN
  866.  
  867.              (********** Gucken obs Dir Bilder gibt **********)
  868.  
  869.    String.Copy(Pb^.OldDir,Pb^.DirBilder) ;          (* aktuelles Dir retten *)
  870.    Lenge := String.Length(Pb^.DirBilder) ;
  871.  
  872.    IF String.Occurs(Pb^.DirBilder,Lenge-1,':',TRUE) # -1 THEN  (* dann haengt ein : dran *)
  873.       String.Insert(Pb^.DirBilder,-1,'Bilder') ;           (* im RootDir *)
  874.    ELSE
  875.       String.Insert(Pb^.DirBilder,-1,'/Bilder') ;          (* sonst *)
  876.    END ;
  877.  
  878.  
  879.    V^.FlPtr:=Lock(ADR(Pb^.DirBilder),sharedLock);
  880.  
  881.    IF V^.FlPtr = NIL THEN                      (* gibt kein Dir Bilder *)
  882.       String.Copy(Pb^.DirBilder,Pb^.OldDir) ;  (* nehme aktuelles *)
  883.    END ;
  884.  
  885.    UnLock(V^.FlPtr);
  886.  
  887.  
  888.               (********** Gucken obs Dir Funktionen gibt**********)
  889.  
  890.    String.Copy(Pb^.DirFunktionen,Pb^.OldDir) ;           (* aktuelles Dir holen *)
  891.    Lenge := String.Length(Pb^.DirFunktionen) ;
  892.  
  893.    IF String.Occurs(Pb^.DirFunktionen,Lenge-1,':',TRUE) # -1 THEN  (* dann haengt ein : dran *)
  894.       String.Insert(Pb^.DirFunktionen,-1,'Funktionen') ;     (* im RootDir *)
  895.    ELSE
  896.       String.Insert(Pb^.DirFunktionen,-1,'/Funktionen') ;  (* sonst *)
  897.    END ;
  898.  
  899.  
  900.    V^.FlPtr:=Lock(ADR(Pb^.DirFunktionen),sharedLock);
  901.  
  902.    IF V^.FlPtr = NIL THEN                    (* gibt kein Dir Funktionen *)
  903.       String.Copy(Pb^.DirFunktionen,Pb^.OldDir) ;(* Dir = aktuelles *)
  904.    END ;
  905.  
  906.    UnLock(V^.FlPtr);
  907.  
  908.  
  909.    IF Arg THEN                            (* Argument vorhanden ? *)
  910.  
  911.       Pb^.FunktionName := Pb^.Funktion ;  (* Argument sei der Name  *)
  912.  
  913.       V^.FlPtr:=Lock(ADR(Pb^.DirFunktionen),sharedLock);
  914.       V^.OldLock := CurrentDir(V^.FlPtr) ;
  915.       V^.FlPtr := Lock(ADR(Pb^.Funktion),sharedLock) ;
  916.  
  917.       IF V^.FlPtr # NIL THEN
  918.          UnLock(V^.FlPtr) ;               (* File existiert *)
  919.          IF Laden(Pb,FALSE) THEN
  920.             RETURN TRUE ;
  921.          ELSE
  922.             RETURN FALSE ;
  923.          END ;
  924.       ELSE
  925.          UnLock(V^.FlPtr) ;               (* File gibts nicht, dann war das *)
  926.          Pb^.FunktionName := '' ;         (* Argument die Funktion *)
  927.          Pb^.letzterName  := '' ;
  928.       END (* IF *);
  929.  
  930.       IF FunktionTesten(Pb) THEN          (* Funktion ist da *)
  931.          Pb^.BildName := Pb^.FunktionName ;
  932.          RETURN TRUE ;
  933.       END ;
  934.  
  935.       IF FunktionHolen(Pb,FALSE,FALSE) THEN      (* Funktion hat Fehler *)
  936.          RETURN TRUE ;
  937.       END ;
  938.    END ;
  939.  
  940.  
  941.    RETURN FALSE ;                  (* cancel beim Stringrequester *)
  942.                                    (* oder kein Argument  *)
  943. END ArgTesten ;
  944.  
  945.  
  946.  
  947. (*------------------------------------------------------------------------
  948.  
  949.    Hier werden, je nachdem, ob große oder kleine Bitmap gewählt ist,
  950.    der Nullpunkt des Koordinatenkreuzes und die x- und y-Offsets des
  951.    Kastens berechnet.
  952.  
  953.   ------------------------------------------------------------------------*)
  954.  
  955. PROCEDURE UpdatePb(Pb: PlotBasePtr) ;
  956.  
  957.  BEGIN
  958.  
  959.     IF Pb^.GrosseBitmap THEN
  960.       Pb^.KastenX0 := 450 ;
  961.       Pb^.KastenY0 := 138 ;
  962.  
  963.       Pb^.A.XNull := -(FFPToInt(Pb^.B.XLinks*96.0/Pb^.B.DeltaX));
  964.       IF Pb^.A.XNull < 0 THEN Pb^.A.XNull := 0 ; END ;
  965.       IF Pb^.A.XNull > 384 THEN Pb^.A.XNull := 384 ; END ;
  966.  
  967.       Pb^.A.YNull := -FFPToInt(Pb^.B.YHinten*48.0/Pb^.B.DeltaY) ;
  968.       IF Pb^.A.YNull < 0   THEN Pb^.A.YNull := 0   ; END ;
  969.       IF Pb^.A.YNull > 144 THEN Pb^.A.YNull := 144 ; END ;
  970.  
  971.       Pb^.A.ZNull := FFPToInt(Pb^.B.ZOben/Pb^.B.DeltaZ *60.0) ;
  972.       IF Pb^.A.ZNull < 0  THEN Pb^.A.ZNull := 0  ; END ;
  973.       IF Pb^.A.ZNull > 240 THEN Pb^.A.ZNull := 240 ; END ;
  974.  
  975.     ELSE
  976.       Pb^.KastenX0 := 160 ;
  977.       Pb^.KastenY0 := 46 ;
  978.  
  979.       Pb^.A.XNull := -(FFPToInt(Pb^.B.XLinks*96.0/Pb^.B.DeltaX));
  980.       IF Pb^.A.XNull < 0 THEN Pb^.A.XNull := 0 ; END ;
  981.       IF Pb^.A.XNull > 384 THEN Pb^.A.XNull := 384 ; END ;
  982.  
  983.       Pb^.A.YNull := -FFPToInt(Pb^.B.YHinten*48.0/Pb^.B.DeltaY) ;
  984.       IF Pb^.A.YNull < 0   THEN Pb^.A.YNull := 0   ; END ;
  985.       IF Pb^.A.YNull > 144 THEN Pb^.A.YNull := 144 ; END ;
  986.  
  987.       Pb^.A.ZNull := FFPToInt(Pb^.B.ZOben/Pb^.B.DeltaZ *60.0) ;
  988.       IF Pb^.A.ZNull < 0  THEN Pb^.A.ZNull := 0  ; END ;
  989.       IF Pb^.A.ZNull > 240 THEN Pb^.A.ZNull := 240 ; END ;
  990.    END ;
  991.  
  992. END UpdatePb ;
  993.  
  994.  
  995.  
  996.  
  997. PROCEDURE ScreenHoch(MyScreenPtr:IntuitionD.ScreenPtr) ;
  998.   VAR i,h,t : INTEGER ;
  999.  
  1000.  
  1001.   BEGIN
  1002.      h := MyScreenPtr^.height ;
  1003.      t := MyScreenPtr^.topEdge ;
  1004.      IntuitionL.MoveScreen(MyScreenPtr,0,h-t-3) ;  (* erst mal ganz runter *)
  1005.      IntuitionL.ScreenToFront(MyScreenPtr) ;
  1006.  
  1007.      IntuitionL.MoveScreen(MyScreenPtr,0,-2) ;
  1008.      IntuitionL.MoveScreen(MyScreenPtr,0,-4) ;
  1009.      IntuitionL.MoveScreen(MyScreenPtr,0,-5) ;
  1010.      IntuitionL.MoveScreen(MyScreenPtr,0,-6) ;
  1011.      IntuitionL.MoveScreen(MyScreenPtr,0,-7) ;
  1012.      IntuitionL.MoveScreen(MyScreenPtr,0,-8) ;
  1013.      IntuitionL.MoveScreen(MyScreenPtr,0,-9) ;
  1014.      IntuitionL.MoveScreen(MyScreenPtr,0,-10) ;
  1015.      IntuitionL.MoveScreen(MyScreenPtr,0,-11) ;
  1016.      IntuitionL.MoveScreen(MyScreenPtr,0,-12) ;
  1017.      IntuitionL.MoveScreen(MyScreenPtr,0,-13) ;
  1018.      IntuitionL.MoveScreen(MyScreenPtr,0,-15) ;
  1019.      IntuitionL.MoveScreen(MyScreenPtr,0,-17) ;
  1020.      IntuitionL.MoveScreen(MyScreenPtr,0,-19) ;
  1021.      IntuitionL.MoveScreen(MyScreenPtr,0,-21) ;
  1022.      IntuitionL.MoveScreen(MyScreenPtr,0,-23) ;
  1023.      IntuitionL.MoveScreen(MyScreenPtr,0,-25) ;
  1024.  
  1025.      FOR i := 1 TO MyScreenPtr^.topEdge/35  DO
  1026.         IntuitionL.MoveScreen(MyScreenPtr,0,-35) ;
  1027.      END (* FOR *) ;
  1028.  
  1029.      IntuitionL.MoveScreen(MyScreenPtr,0,-MyScreenPtr^.topEdge);
  1030.      IntuitionL.MoveScreen(MyScreenPtr,0,16) ;
  1031.      IntuitionL.MoveScreen(MyScreenPtr,0,16) ;
  1032.      IntuitionL.MoveScreen(MyScreenPtr,0,16) ;
  1033.      IntuitionL.MoveScreen(MyScreenPtr,0,16) ;
  1034.      IntuitionL.MoveScreen(MyScreenPtr,0,14) ;
  1035.      IntuitionL.MoveScreen(MyScreenPtr,0,12) ;
  1036.      IntuitionL.MoveScreen(MyScreenPtr,0,10) ;
  1037.      IntuitionL.MoveScreen(MyScreenPtr,0,8) ;
  1038.      IntuitionL.MoveScreen(MyScreenPtr,0,3) ;
  1039.      IntuitionL.MoveScreen(MyScreenPtr,0,4) ;
  1040.      IntuitionL.MoveScreen(MyScreenPtr,0,2) ;
  1041.      IntuitionL.MoveScreen(MyScreenPtr,0,2) ;
  1042.      IntuitionL.MoveScreen(MyScreenPtr,0,1) ;
  1043.      IntuitionL.MoveScreen(MyScreenPtr,0,0) ;
  1044.      IntuitionL.MoveScreen(MyScreenPtr,0,-2) ;
  1045.      IntuitionL.MoveScreen(MyScreenPtr,0,-4) ;
  1046.      FOR i := 1 TO 16 DO
  1047.         IntuitionL.MoveScreen(MyScreenPtr,0,-7) ;
  1048.      END ;
  1049.  
  1050.  
  1051. END ScreenHoch ;
  1052.  
  1053.  
  1054.  
  1055. PROCEDURE ScreenWeg(MyScreenPtr: IntuitionD.ScreenPtr) ;
  1056.   VAR i : INTEGER ;
  1057.  
  1058.   BEGIN
  1059.      IntuitionL.MoveScreen(MyScreenPtr,0,2) ;
  1060.      IntuitionL.MoveScreen(MyScreenPtr,0,4) ;
  1061.      IntuitionL.MoveScreen(MyScreenPtr,0,5) ;
  1062.      IntuitionL.MoveScreen(MyScreenPtr,0,6) ;
  1063.      IntuitionL.MoveScreen(MyScreenPtr,0,7) ;
  1064.      IntuitionL.MoveScreen(MyScreenPtr,0,8) ;
  1065.      IntuitionL.MoveScreen(MyScreenPtr,0,9) ;
  1066.      IntuitionL.MoveScreen(MyScreenPtr,0,10) ;
  1067.      IntuitionL.MoveScreen(MyScreenPtr,0,11) ;
  1068.      IntuitionL.MoveScreen(MyScreenPtr,0,12) ;
  1069.      IntuitionL.MoveScreen(MyScreenPtr,0,13) ;
  1070.      IntuitionL.MoveScreen(MyScreenPtr,0,15) ;
  1071.      IntuitionL.MoveScreen(MyScreenPtr,0,17) ;
  1072.      IntuitionL.MoveScreen(MyScreenPtr,0,19) ;
  1073.      IntuitionL.MoveScreen(MyScreenPtr,0,21) ;
  1074.      IntuitionL.MoveScreen(MyScreenPtr,0,23) ;
  1075.      IntuitionL.MoveScreen(MyScreenPtr,0,25) ;
  1076.  
  1077.      FOR i := 1 TO MyScreenPtr^.topEdge/35 DO
  1078.         IntuitionL.MoveScreen(MyScreenPtr,0,35) ;
  1079.      END (* FOR *) ;
  1080.  
  1081.      IntuitionL.ScreenToBack(MyScreenPtr) ;
  1082. END ScreenWeg ;
  1083.  
  1084.  
  1085. PROCEDURE MenuNummer(code:CARDINAL):CARDINAL;
  1086.   BEGIN
  1087.     RETURN code MOD 32
  1088.   END MenuNummer;
  1089.  
  1090.  
  1091. PROCEDURE ItemNummer(code:CARDINAL):CARDINAL;
  1092.   BEGIN
  1093.     RETURN (code DIV 32) MOD 64
  1094.   END ItemNummer;
  1095.  
  1096.  
  1097. PROCEDURE SubItemNummer(code:CARDINAL):CARDINAL ;
  1098.   BEGIN
  1099.     RETURN ((code DIV 32) DIV 64) MOD 32
  1100.   END SubItemNummer ;
  1101.  
  1102.  
  1103. (*-----------------------------------------------------------------------
  1104.  
  1105.    Das Problem hier ist, den Tastenrepeater auszuschalten. Es wird nur
  1106.    eine Taste weitergemeldet, wenn diese losgelassen wird.
  1107.    Es werden nur die Funkrionstasten, die Zahlentasten direkt drunter, der
  1108.    Zahlenblock, die ESC, CTRL-C, die Helptaste, die beiden SHIFT und die
  1109.    beiden ALT-Tasten abgefragt.
  1110.    Beim Drücken einer ALT,SHIFT oder CTRL Taste wird AltR,AltL,ShiftL,ShiftR
  1111.    oder Ctrl auf TRUE gesetzt. Bei anderen Tasten wird Ein = TRUE.
  1112.    Wenn jetzt der Tastenrepeater anfängt diese Taste sinnlos zu wiederholen,
  1113.    passiert überhaupt nichts. Erst wenn die Taste losgelassen wird, wird
  1114.    Ein, bzw ShiftL,ShiftR... auf FALSE gesetzt und die Taste wird gemeldet.
  1115.  
  1116.    Das geht, weil die RawKey-Codes vom Drücken einer Taste und vom Loslassen
  1117.    unterschiedlich sind.
  1118.  
  1119.   --------------------------------------------------------------------------*)
  1120.  
  1121.  
  1122. PROCEDURE WelcheTaste(code:CARDINAL):CARDINAL ;
  1123.  
  1124.  
  1125. VAR
  1126.     Ein,ShiftL,ShiftR,AltL,AltR,F1,F2,F3,F4,F5,F6,F7,F8,F9,F10: BOOLEAN ;
  1127.     Ctrl   : BOOLEAN ;
  1128.  
  1129.  
  1130.    BEGIN
  1131.        IF NOT Ein THEN
  1132.           CASE code OF
  1133.              76     : Ein := TRUE ;
  1134.                       IF (ShiftL OR ShiftR) THEN RETURN 261; (* rauf *)
  1135.                       ELSIF (AltL OR AltR)  THEN RETURN 262;
  1136.                       ELSE                       RETURN 260 ;
  1137.                       END (* IF *) ; |
  1138.  
  1139.              77     : Ein := TRUE ;
  1140.                       IF (ShiftL OR ShiftR) THEN RETURN 266; (* runter *)
  1141.                       ELSIF (AltL OR AltR)  THEN RETURN 267;
  1142.                       ELSE                       RETURN 265 ;
  1143.                       END (* IF *) ; |
  1144.  
  1145.              78     : Ein := TRUE ;
  1146.                       IF (ShiftL OR ShiftR) THEN RETURN 276 ; (* rechts *)
  1147.                       ELSIF (AltL OR AltR)  THEN RETURN 277 ;
  1148.                       ELSE                       RETURN 275 ;
  1149.                       END (* IF *) ; |
  1150.  
  1151.              79     : Ein := TRUE ;
  1152.                       IF (ShiftL OR ShiftR) THEN RETURN 271 ; (* links *)
  1153.                       ELSIF (AltL OR AltR)  THEN RETURN 272 ;
  1154.                       ELSE                       RETURN 270;
  1155.                       END (* IF *) ; |
  1156.  
  1157.              51     : Ein := TRUE ;                          (* CTRL C  *)
  1158.                       IF Ctrl THEN RETURN 278 ;  END (* IF *); |
  1159.  
  1160.              69     : Ein := TRUE ;
  1161.                       RETURN 280 ;                           (* ESC *) |
  1162.  
  1163.              95     : Ein := TRUE ; RETURN 281; (* Help *) |
  1164.  
  1165.              80     : Ein := TRUE ; RETURN 291; (* F1 *) |
  1166.  
  1167.              81     : Ein := TRUE ; RETURN 292; (* F2 *) |
  1168.  
  1169.              82     : Ein := TRUE ; RETURN 293; (* F3 *) |
  1170.  
  1171.              83     : Ein := TRUE ; RETURN 294; (* F4 *) |
  1172.  
  1173.              84     : Ein := TRUE ; RETURN 295; (* F5 *) |
  1174.  
  1175.              85     : Ein := TRUE ; RETURN 296; (* F6 *) |
  1176.  
  1177.              86     : Ein := TRUE ; RETURN 297; (* F7 *) |
  1178.  
  1179.              87     : Ein := TRUE ; RETURN 298; (* F8 *) |
  1180.  
  1181.              88     : Ein := TRUE ; RETURN 299; (* F9 *) |
  1182.  
  1183.              89     : Ein := TRUE ; RETURN 300; (* F10 *) |
  1184.  
  1185.              1      : Ein := TRUE ; RETURN 301; (* 1 *) |
  1186.  
  1187.              2      : Ein := TRUE ; RETURN 302; (* 2 *) |
  1188.  
  1189.              3      : Ein := TRUE ; RETURN 303; (* 3 *) |
  1190.  
  1191.              4      : Ein := TRUE ; RETURN 304; (* 4 *) |
  1192.  
  1193.              5      : Ein := TRUE ; RETURN 305; (* 5 *) |
  1194.  
  1195.              6      : Ein := TRUE ; RETURN 306; (* 6 *) |
  1196.  
  1197.              7      : Ein := TRUE ; RETURN 307; (* 7 *) |
  1198.  
  1199.              8      : Ein := TRUE ; RETURN 308; (* 8 *) |
  1200.  
  1201.              9      : Ein := TRUE ; RETURN 309; (* 9 *) |
  1202.  
  1203.              10     : Ein := TRUE ; RETURN 310; (* 0 *) |
  1204.  
  1205.              29     : Ein := TRUE ;             (* 1 *)    (* Zehnerblock *)
  1206.                       IF (ShiftL OR ShiftR) THEN RETURN 321 ;
  1207.                       ELSIF (AltL OR AltR)  THEN RETURN 331 ;
  1208.                       ELSE                       RETURN 311;
  1209.                       END (* IF *) ; |
  1210.  
  1211.              30     : Ein := TRUE ;             (* 2 *)
  1212.                       IF (ShiftL OR ShiftR) THEN RETURN 322 ;
  1213.                       ELSIF (AltL OR AltR)  THEN RETURN 332 ;
  1214.                       ELSE                       RETURN 312;
  1215.                       END (* IF *) ; |
  1216.  
  1217.              31     : Ein := TRUE ;             (* 3 *)
  1218.                       IF (ShiftL OR ShiftR) THEN RETURN 323 ;
  1219.                       ELSIF (AltL OR AltR)  THEN RETURN 333 ;
  1220.                       ELSE                       RETURN 313;
  1221.                       END (* IF *) ; |
  1222.  
  1223.              45     : Ein := TRUE ;             (* 4 *)
  1224.                       IF (ShiftL OR ShiftR) THEN RETURN 324 ;
  1225.                       ELSIF (AltL OR AltR)  THEN RETURN 334 ;
  1226.                       ELSE                       RETURN 314;
  1227.                       END (* IF *) ; |
  1228.  
  1229.              46     : Ein := TRUE ;             (* 5 *)
  1230.                       IF (ShiftL OR ShiftR) THEN RETURN 325 ;
  1231.                       ELSIF (AltL OR AltR)  THEN RETURN 335 ;
  1232.                       ELSE                       RETURN 315;
  1233.                       END (* IF *) ; |
  1234.  
  1235.              47     : Ein := TRUE ;             (* 6 *)
  1236.                       IF (ShiftL OR ShiftR) THEN RETURN 326 ;
  1237.                       ELSIF (AltL OR AltR)  THEN RETURN 336 ;
  1238.                       ELSE                       RETURN 316;
  1239.                       END (* IF *) ; |
  1240.  
  1241.              61     : Ein := TRUE ;             (* 7 *)
  1242.                       IF (ShiftL OR ShiftR) THEN RETURN 327 ;
  1243.                       ELSIF (AltL OR AltR)  THEN RETURN 337 ;
  1244.                       ELSE                       RETURN 317;
  1245.                       END (* IF *) ; |
  1246.  
  1247.              62     : Ein := TRUE ;             (* 8 *)
  1248.                       IF (ShiftL OR ShiftR) THEN RETURN 328 ;
  1249.                       ELSIF (AltL OR AltR)  THEN RETURN 338 ;
  1250.                       ELSE                       RETURN 318;
  1251.                       END (* IF *) ; |
  1252.  
  1253.              63     : Ein := TRUE ;             (* 9 *)
  1254.                       IF (ShiftL OR ShiftR) THEN RETURN 329 ;
  1255.                       ELSIF (AltL OR AltR)  THEN RETURN 339 ;
  1256.                       ELSE                       RETURN 319;
  1257.                       END (* IF *) ; |
  1258.  
  1259.              15     : Ein := TRUE ;             (* 0 *)
  1260.                       IF (ShiftL OR ShiftR) THEN RETURN 330 ;
  1261.                       ELSIF (AltL OR AltR)  THEN RETURN 340 ;
  1262.                       ELSE                       RETURN 320;
  1263.                       END (* IF *) ; |
  1264.  
  1265.           ELSE
  1266.           END (* CASE *) ;
  1267.        END (* IF *) ;
  1268.  
  1269.        CASE code OF 129..223 : Ein    := FALSE; |
  1270.                          224 : ShiftL := FALSE; |
  1271.                          225 : ShiftR := FALSE; |
  1272.                          227 : Ctrl   := FALSE; |
  1273.                          228 : AltL   := FALSE; |
  1274.                          229 : AltR   := FALSE; |
  1275.                          96  : ShiftL := TRUE; |
  1276.                          97  : ShiftR := TRUE; |
  1277.                          99  : Ctrl   := TRUE; |
  1278.                          100 : AltL   := TRUE; |
  1279.                          101 : AltR   := TRUE;
  1280.        ELSE ;
  1281.        END (* CASE *) ;
  1282.        RETURN 0 ;
  1283.  
  1284. END WelcheTaste ;
  1285.  
  1286.  
  1287.  
  1288. (*----------------------------------------------------------------------
  1289.  
  1290.   Hier wird nach Aufruf des Filerequesters das Bild als IFF-Datei gespeichert.
  1291.   Falls am Dateinamen schon ein .IFF dranhängt ists ok, andernfalls kommt
  1292.   ein .IFF hin.
  1293.  
  1294.   ----------------------------------------------------------------------*)
  1295.  
  1296. PROCEDURE BildSpeichern(Pb: PlotBasePtr) ;
  1297.  
  1298.  VAR
  1299.      TempStr : ARRAY[0..4] OF CHAR ;
  1300.      colTab  : ADDRESS;
  1301.      bmp     : ADDRESS ;
  1302.      f       : IFFLib.SaveIFFFlagSet;
  1303.  
  1304.  BEGIN
  1305.  
  1306.     IF FileRequest(Pb^.Window,FALSE,TRUE,'Bild speichern',
  1307.                               Pb^.DirBilder,Pb^.BildName)  THEN
  1308.  
  1309.  
  1310.        V^.FlPtr:=Lock(ADR(Pb^.DirBilder),sharedLock);
  1311.  
  1312.        IF V^.FlPtr # NIL THEN
  1313.  
  1314.           GraphicsL.SetRGB4(ADR(Pb^.Screen^.viewPort),0,15,15,15) ;
  1315.           V^.OldLock := CurrentDir(V^.FlPtr) ;
  1316.  
  1317.           f := IFFLib.SaveIFFFlagSet{IFFLib.cmpByteRun1};
  1318.           colTab := Pb^.Screen^.viewPort.colorMap^.colorTable ;
  1319.  
  1320.           TempStr := '.IFF' ;
  1321.  
  1322.           IF String.ComparePart(Pb^.BildName,(String.Length(Pb^.BildName)-4),
  1323.                                 4,TempStr,FALSE) # 0 THEN
  1324.                                                       (* .IFF fehlt noch *)
  1325.              String.Concat(Pb^.BildName,TempStr) ;    (* .IFF dranmachen *)
  1326.  
  1327.           END  (* IF *) ;
  1328.  
  1329.  
  1330.  
  1331.           IF Pb^.GrosseBitmap THEN
  1332.              bmp := MyBitMapPtr ;
  1333.              OK := IFFLib.SaveClip(ADR(Pb^.BildName),bmp,colTab,f,0,0,215,1350) ;
  1334.           ELSE
  1335.              bmp := ADR(Pb^.Screen^.bitMap) ;
  1336.              OK := IFFLib.SaveClip(ADR(Pb^.BildName),bmp,colTab,f,1,10,79,480) ;
  1337.           END ;
  1338.  
  1339.           UnLock(V^.FlPtr);
  1340.  
  1341.           GraphicsL.SetRGB4(ADR(Pb^.Screen^.viewPort),0,10,10,10) ;
  1342.        END ; (* IF FlPtr *)
  1343.  
  1344.  
  1345.     END (* IF FileRequest *) ;
  1346.  
  1347.  END BildSpeichern ;
  1348.  
  1349.  
  1350.  
  1351. PROCEDURE BildLaden(Pb: PlotBasePtr): INTEGER ;
  1352.  
  1353.  TYPE Str = ARRAY[0..50] OF CHAR ;
  1354.  
  1355.  VAR ifffile : ADDRESS ;
  1356.      name    : Str ;
  1357.      NamePtr : POINTER TO Str ;
  1358.      BitmapPtr: GraphicsD.BitMapPtr ;
  1359.  
  1360.  BEGIN
  1361.  
  1362.     NamePtr := ADR(name) ;
  1363.     IF FileRequest(Pb^.Window,FALSE,TRUE,'Bild laden',
  1364.                               Pb^.DirBilder,name)  THEN
  1365.  
  1366.        V^.FlPtr:=Lock(ADR(Pb^.DirBilder),sharedLock);
  1367.  
  1368.        IF V^.FlPtr # NIL THEN
  1369.  
  1370.           V^.OldLock := CurrentDir(V^.FlPtr) ;
  1371.           ifffile := IFFLib.OpenIFF(NamePtr) ;
  1372.           IF ifffile = 0 THEN
  1373.              UnLock(V^.FlPtr);
  1374.              RETURN IFFLib.IffError() ;
  1375.           END ;
  1376.  
  1377.  
  1378.           IF Pb^.GrosserSpeicher THEN
  1379.  
  1380.              IF NOT IFFLib.DecodePic(ifffile,MyBitMapPtr) THEN
  1381.                 UnLock(V^.FlPtr);
  1382.                 IFFLib.CloseIFF(ifffile) ;
  1383.                 ExecL.FreeMem(BitmapPtr,SIZE(GraphicsD.BitMap)) ;
  1384.                 BitmapPtr := NIL ;
  1385.                 RETURN IFFLib.IffError() ;
  1386.              END ;
  1387.  
  1388.           ELSE
  1389.              BitmapPtr := ExecL.AllocMem(SIZE(GraphicsD.BitMap),
  1390.                                          ExecD.MemReqSet{ExecD.public}) ;
  1391.  
  1392.              IF BitmapPtr = NIL THEN
  1393.                 UnLock(V^.FlPtr);
  1394.                 IFFLib.CloseIFF(ifffile) ;
  1395.                 RETURN 1 ;
  1396.              END ;
  1397.  
  1398.              BitmapPtr^ := Pb^.Screen^.bitMap ;
  1399.  
  1400.              IF NOT IFFLib.DecodePic(ifffile,BitmapPtr) THEN
  1401.                 UnLock(V^.FlPtr);
  1402.                 IFFLib.CloseIFF(ifffile) ;
  1403.                 ExecL.FreeMem(BitmapPtr,SIZE(GraphicsD.BitMap)) ;
  1404.                 BitmapPtr := NIL ;
  1405.                 RETURN IFFLib.IffError() ;
  1406.              END ;
  1407.  
  1408.              ExecL.FreeMem(BitmapPtr,SIZE(GraphicsD.BitMap)) ;
  1409.              BitmapPtr := NIL ;
  1410.  
  1411.           END (* IF Pb^.GrosserSpeicher *) ;
  1412.  
  1413.  
  1414.           UnLock(V^.FlPtr);
  1415.           IFFLib.CloseIFF(ifffile) ;
  1416.           RETURN 0 ;
  1417.  
  1418.        END (* IF FlPtr *) ;
  1419.     END (* IF FileRequest *) ;
  1420.  
  1421. END BildLaden ;
  1422.  
  1423.  
  1424. END PlotInit.
  1425.  
  1426.  
  1427.  
  1428.  
  1429.  
  1430.  
  1431.  
  1432.